package io.gitee.zhangbinhub.acp.core.common

import io.gitee.zhangbinhub.acp.core.common.tools.Calculation
import io.gitee.zhangbinhub.acp.core.common.tools.CommonUtils
import org.joda.time.DateTime

/**
 * @since JDK 17
 */
object CalendarTools {
    /**
     * yyyy-MM-dd HH:mm:ss
     */
    const val DATETIME_FORMAT = Calculation.DATETIME_FORMAT

    /**
     * yyyy-MM-dd
     */
    const val DATE_FORMAT = Calculation.DATE_FORMAT

    /**
     * 获取当前时刻的 DateTime 实例
     *
     * @return DateTime 实例
     */
    @JvmStatic
    fun getNowDateTime(): DateTime = DateTime()

    /**
     * 获取当前日期
     *
     * @return 日期字符串
     */
    @JvmStatic
    fun getNowString(): String = getDateTimeString(dateTimeFormat = DATE_FORMAT)

    /**
     * 获取当前时间
     *
     * @return 日期时间字符串
     */
    @JvmStatic
    fun getNowTimeString(): String = getDateTimeString(dateTimeFormat = DATETIME_FORMAT)

    /**
     * 获取指定格式的时间字符串
     *
     * @param dateTime       DateTime 实例
     * @param dateTimeFormat 格式
     * @return 格式化的时间格式
     */
    @JvmStatic
    @JvmOverloads
    fun getDateTimeString(dateTime: DateTime? = null, dateTimeFormat: String = ""): String {
        val time = dateTime ?: getNowDateTime()
        var format = dateTimeFormat
        if (CommonUtils.isNullStr(dateTimeFormat)) {
            format = DATETIME_FORMAT
        }
        return time.toString(format)
    }

    /**
     * 根据时间戳获取日期对象
     *
     * @param instant 时间戳
     * @return 日期对象
     */
    @JvmStatic
    fun getCalendar(instant: Long): DateTime = Calculation.getCalendar(instant)

    /**
     * 获取日期对象
     *
     * @param dateTimeStr    日期字符串
     * @param dateTimeFormat 格式字符串
     * @return 日期对象
     */
    @JvmStatic
    @JvmOverloads
    fun getCalendar(dateTimeStr: String, dateTimeFormat: String = DATE_FORMAT): DateTime =
        Calculation.getCalendar(dateTimeStr, dateTimeFormat)

    /**
     * 获取指定日期的后一天
     *
     * @param dateTime 日期对象
     * @return 日期对象
     */
    @JvmStatic
    fun getNextDay(dateTime: DateTime): DateTime = Calculation.getNextDay(dateTime)

    /**
     * 获取指定日期前一天
     *
     * @param dateTime 日期对象
     * @return 日期对象
     */
    @JvmStatic
    fun getPrevDay(dateTime: DateTime): DateTime = Calculation.getPrevDay(dateTime)

    /**
     * 获取指定日期是一周中第几天
     *
     * @param dateTime 日期对象
     * @return 结果（1-7）,其中sunday是7
     */
    @JvmStatic
    fun getWeekNo(dateTime: DateTime): Int = Calculation.getWeekNo(dateTime)

    /**
     * 获取指定日期日号
     *
     * @param dateTime 日期对象
     * @return 日号（1-31）
     */
    @JvmStatic
    fun getDayNo(dateTime: DateTime): Int = Calculation.getDayNo(dateTime)

    /**
     * 获取指定月号
     *
     * @param dateTime 日期对象
     * @return 月号（1-12）
     */
    @JvmStatic
    fun getMonthNo(dateTime: DateTime): Int = Calculation.getMonthNo(dateTime)

    /**
     * 获取指定月所在季度内的月号
     *
     * @param dateTime 日期对象
     * @return 季度内的月号（1, 2, 3）
     */
    @JvmStatic
    fun getMonthNoInQuarter(dateTime: DateTime): Int = Calculation.getMonthNoInQuarter(dateTime)

    /**
     * 获取指定月最后一天日号
     *
     * @param dateTime 日期对象
     * @return 日号
     */
    @JvmStatic
    fun getLastDayInMonthNo(dateTime: DateTime): Int = Calculation.getLastDayInMonthNo(dateTime)

    /**
     * 判断当前时间是否是工作日
     *
     * @param dateTime 日期对象
     * @return 是否是工作日
     */
    @JvmStatic
    fun isWeekDay(dateTime: DateTime): Boolean = Calculation.isWeekDay(dateTime)

    /**
     * 判断当前时间是否是周末
     *
     * @param dateTime 日期对象
     * @return 是否是周末
     */
    @JvmStatic
    fun isWeekend(dateTime: DateTime): Boolean = Calculation.isWeekend(dateTime)

    /**
     * 获取指定时间的当月第一天0点0分0秒
     *
     * @param dateTime 指定日期时间
     * @return 指定日期的0点0分0秒
     */
    @JvmStatic
    fun currMonthFirstDay(dateTime: DateTime): DateTime = Calculation.currMonthFirstDay(dateTime)

    /**
     * 获取指定时间的次月第一天0点0分0秒
     *
     * @param dateTime 指定日期时间
     * @return 指定日期的0点0分0秒
     */
    @JvmStatic
    fun nextMonthFirstDay(dateTime: DateTime): DateTime = Calculation.nextMonthFirstDay(dateTime)

    /**
     * 获取指定时间的0点0分0秒
     *
     * @param dateTime 指定日期时间
     * @return 指定日期的0点0分0秒
     */
    @JvmStatic
    fun dateZero(dateTime: DateTime): DateTime = Calculation.dateZero(dateTime)

    /**
     * local时间转换成UTC时间
     */
    @JvmStatic
    fun localToUtc(localDateTime: DateTime): DateTime = Calculation.localToUtc(localDateTime)

    /**
     * utc时间转成local时间
     */
    @JvmStatic
    fun utcToLocal(utcDateTime: DateTime): DateTime = Calculation.utcToLocal(utcDateTime)
}